package us.proyecto.canarios.domain;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;

import org.hibernate.validator.Pattern;

/**
 * Clase que mapea la tabla PUNTUACION
 *
 * @author Juan Antonio Mena Sánchez
 *
 */
@Entity
@Table(name = "PUNTUACION")
public class Puntuacion {

	private int idPuntuacion;
	private Pajaro pajaro;
	private Concurso concurso;
	private String criterio1;
	private String criterio2;
	private String criterio3;
	private String criterio4;
	private String criterio5;
	private String criterio6;
	private String criterio7;
	private String puntuacion;
	private Set<Incidencia> incidencias; //TODO crear clase incidencias
	private Double precio;
	private Boolean baja;
	private Boolean vendido;
	private Boolean descalificado;
	private PuntuacionGrupo puntuacionGrupo;
	private Premio premio;
	private String evaluado;
	private String motivo;
	private Integer numJaula;
	private Set<Votacion> votaciones = new HashSet<Votacion>(0);

	/**
	 * Getter de idPuntuacion
	 * @return idPuntuacion String
	 */
	@Id
    @SequenceGenerator(name = "puntuacionId", sequenceName = "CAN_PUN_SEQ", initialValue = 1, allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "puntuacionId")
    @Column(name = "ID_PUNTUACION", nullable = false, precision = 8, scale = 0)
	public int getIdPuntuacion() {
		return idPuntuacion;
	}
	/**
	 * @param idPuntuacion the idPuntuacion to set
	 */
	public void setIdPuntuacion(int idPuntuacion) {
		this.idPuntuacion = idPuntuacion;
	}
	/**
	 * @return the pajaro
	 */
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "FK_PAJARO")
	public Pajaro getPajaro() {
		return pajaro;
	}
	/**
	 * @param pajaro the pajaro to set
	 */
	public void setPajaro(Pajaro pajaro) {
		this.pajaro = pajaro;
	}
	/**
	 * @return the concurso
	 */
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "FK_CONCURSO")
	public Concurso getConcurso() {
		return concurso;
	}
	/**
	 * @param concurso the concurso to set
	 */
	public void setConcurso(Concurso concurso) {
		this.concurso = concurso;
	}
	/**
	 * @return the criterio1
	 */
	@Column(name = "CRITERIO_1", length= 5)
	@Pattern(regex="[2]?[1-5]?", message="La puntuación de melaninas debe estar comprendida entre 21 y 25")
	public String getCriterio1() {
		return criterio1;
	}
	/**
	 * @param criterio1 the criterio1 to set
	 */
	public void setCriterio1(String criterio1) {
		this.criterio1 = criterio1;
	}
	/**
	 * @return the criterio2
	 */
	@Column(name = "CRITERIO_2", length= 5)
	@Pattern(regex="([1][1-5])?", message="La puntuación de lipocromos debe estar comprendida entre 11 y 15")
	public String getCriterio2() {
		return criterio2;
	}
	/**
	 * @param criterio2 the criterio2 to set
	 */
	public void setCriterio2(String criterio2) {
		this.criterio2 = criterio2;
	}
	/**
	 * @return the criterio3
	 */
	@Column(name = "CRITERIO_3", length= 5)
	@Pattern(regex="[1]?[1-5]?", message="La puntuación de categoría debe estar comprendida entre 11 y 25")
	public String getCriterio3() {
		return criterio3;
	}
	/**
	 * @param criterio3 the criterio3 to set
	 */
	public void setCriterio3(String criterio3) {
		this.criterio3 = criterio3;
	}
	/**
	 * @return the criterio4
	 */
	@Column(name = "CRITERIO_4", length= 5)
	@Pattern(regex="[1]?[1-5]?", message="La puntuación de plumaje debe estar comprendida entre 11 y 15")
	public String getCriterio4() {
		return criterio4;
	}
	/**
	 * @param criterio4 the criterio4 to set
	 */
	public void setCriterio4(String criterio4) {
		this.criterio4 = criterio4;
	}
	/**
	 * @return the puntuacion
	 */
	@Column(name = "PUNTUACION", length= 6)
	@Pattern(regex="[0-9][0-9]", message="La puntuacion total debe ser un número válido")
	public String getPuntuacion() {
		return puntuacion;
	}
	/**
	 * @param puntuacion the puntuacion to set
	 */
	public void setPuntuacion(String puntuacion) {
		this.puntuacion = puntuacion;
	}
	/**
	 * @return the precio
	 */
	@Column(name = "PRECIO",precision = 8, scale = 2)
	public Double getPrecio() {
		return precio;
	}
	/**
	 * @param precio the precio to set
	 */
	public void setPrecio(Double precio) {
		this.precio = precio;
	}
	/**
	 * @return the baja
	 */
	@Column(name = "BAJA", length= 1)
	public Boolean getBaja() {
		return baja;
	}
	/**
	 * @param baja the baja to set
	 */
	public void setBaja(Boolean baja) {
		this.baja = baja;
	}
	/**
	 * @return the vendido
	 */
	@Column(name = "VENDIDO", length= 1)
	public Boolean getVendido() {
		return vendido;
	}
	/**
	 * @param vendido the vendido to set
	 */
	public void setVendido(Boolean vendido) {
		this.vendido = vendido;
	}
	/**
	 * @return the premio
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "FK_PREMIO")
	public Premio getPremio() {
		return premio;
	}
	/**
	 * @param premio the premio to set
	 */
	public void setPremio(Premio premio) {
		this.premio = premio;
	}
	/**
	 * @return the puntuacionGrupo
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "FK_PUNT_GRUPO")
	public PuntuacionGrupo getPuntuacionGrupo() {
		return puntuacionGrupo;
	}
	/**
	 * @param puntuacionGrupo the puntuacionGrupo to set
	 */
	public void setPuntuacionGrupo(PuntuacionGrupo puntuacionGrupo) {
		this.puntuacionGrupo = puntuacionGrupo;
	}
	@OneToMany(fetch = FetchType.LAZY, mappedBy ="puntuacion", cascade = CascadeType.ALL)
	public Set<Incidencia> getIncidencias() {
		return incidencias;
	}
	public void setIncidencias(Set<Incidencia> incidencias) {
		this.incidencias = incidencias;
	}

	@Column(name = "DESCALIFICADO", length= 1)
	public Boolean getDescalificado() {
		return descalificado;
	}
	public void setDescalificado(Boolean descalificado) {
		this.descalificado = descalificado;
	}
	@Transient
	public String getEvaluado() {
		return evaluado;
	}
	public void setEvaluado(String evaluado) {
		this.evaluado = evaluado;
	}
	@Column(name = "MOTIVO", length= 4000)
	public String getMotivo() {
		return motivo;
	}
	public void setMotivo(String motivo) {
		this.motivo = motivo;
	}
	/**
	 * @return the numJaula
	 */
	@Column(name = "NUM_JAULA", precision = 10, scale = 0)
	public Integer getNumJaula() {
		return numJaula;
	}
	/**
	 * @param numJaula the numJaula to set
	 */

	public void setNumJaula(Integer numJaula) {
		this.numJaula = numJaula;
	}
	
	@Column(name = "CRITERIO_5", length= 5)
	@Pattern(regex="[1]?[1-5]?", message="La puntuación de talla y forma debe estar comprendida entre 11 y 15")
	public String getCriterio5() {
		return criterio5;
	}
	public void setCriterio5(String criterio5) {
		this.criterio5 = criterio5;
	}
	@Column(name = "CRITERIO_6", length= 5)
	@Pattern(regex="[0-1]?[06879]?", message="La puntuación de posición debe estar comprendida entre 6 y 10")
	public String getCriterio6() {
		return criterio6;
	}
	public void setCriterio6(String criterio6) {
		this.criterio6 = criterio6;
	}
	
	@Column(name = "CRITERIO_7", length= 5)
	@Pattern(regex="[0]?[1-5]?", message="La puntuación de impresión general debe estar comprendida entre 1 y 5")
	public String getCriterio7() {
		return criterio7;
	}
	public void setCriterio7(String criterio7) {
		this.criterio7 = criterio7;
	}
	@OneToMany(fetch = FetchType.LAZY, mappedBy ="puntuacion", cascade = CascadeType.ALL)
	public Set<Votacion> getVotaciones() {
		return votaciones;
	}
	public void setVotaciones(Set<Votacion> votaciones) {
		this.votaciones = votaciones;
	}

	
	
	


}
